home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / dbms_mag / 9108 / zdsample.prg < prev   
Text File  |  1991-03-15  |  23KB  |  819 lines

  1. ***************************************************************************
  2. * File name: ZDSAMPLE.PRG
  3. * This program is demonstrates the use of Zero-Balanced Distribution Engine
  4. * Copyright (c) 1986-1991  James F. Shaughnessy, Jr.
  5. *     All rights reserved
  6. * Portions of this code were developed using Ashton-Tate, dBase III Plus
  7. * Portions of this code were developed using Fox Software Foxbase + 2.10
  8. * This version, March, 1991, developed using Fox Software FoxPro 1.02
  9. ***************************************************************************
  10. SET TALK OFF
  11. SET STATUS OFF
  12. vid_bright = "R+/B           " 
  13. vid_nrml   = "GR+/B,W+/R,B   " 
  14. vid_rvrs   = "W+/R           " 
  15. SET COLOR TO &vid_nrml
  16. IF .NOT. FILE ("TRANHDR.DBF")
  17.    CREATE Tranhdr FROM tranhdr.str
  18. ENDIF
  19. IF .NOT. FILE ("TRANDSTR.DBF")
  20.    CREATE Trandstr FROM trandstr.str
  21. ENDIF
  22. SELECT 1
  23. USE Tranhdr
  24. SELECT 2
  25. USE Trandstr
  26. SELECT 3
  27. SET SAFETY OFF
  28. CREATE Dstrwork FROM trandstr.str
  29. SET SAFETY ON
  30. SELECT 1
  31. IF "FOXBASE"$UPPER(VERSION())
  32.    SET PROCEDURE TO zdsample
  33. ENDIF
  34. DO smplmenu
  35. RETURN
  36. *
  37. PROCEDURE smplmenu
  38.  * This a simple menu procedure
  39.    key_press = 0
  40.    paint = .T.
  41.    DO WHILE .T.
  42.       IF paint
  43.          CLEAR
  44.          @  1,26 SAY  "Zero-Balanced Distribution"
  45.          @  2,32 SAY  "Sample System"
  46.          @  1,26 SAY  "Zero-Balanced Distribution"
  47.          @  2,32 SAY  "Sample System"
  48.          @  4,34 SAY  "Main Menu"
  49.          @  5,20 TO 11,58 DOUBLE      
  50.          @  6,28 SAY  "1. Add Transaction"
  51.          @  8,28 SAY  "2. Modify Transaction"
  52.          @ 10,28 SAY  "X. Exit to Dot Prompt"
  53.          paint = .F.
  54.       ENDIF
  55.       usr_inp = "  "
  56.       @ 22,27 SAY "Enter selection " GET usr_inp PICTURE "!!"
  57.       READ
  58.       key_press = keypress()
  59.         usr_inp = IIF(key_press=12,"X",usr_inp)          
  60.       usr_inp = LTRIM(TRIM(usr_inp))
  61.       IF LEN(usr_inp) = 0
  62.          LOOP
  63.       ENDIF
  64.       DO CASE
  65.       CASE usr_inp = "1"
  66.          paint = .T.
  67.          @  4,0  CLEAR
  68.          @  4,31 SAY  "Add Transaction"
  69.          DO WHILE key_press <> 12    && Esc
  70.             c_new_rec = .T.
  71.             DO gethdr
  72.          ENDDO
  73.       CASE usr_inp = "2"
  74.          paint = .T.
  75.          @  4,0  CLEAR
  76.          @  4,29 SAY  "Modify Transaction"
  77.            SELECT tranhdr
  78.          tran_no = 0
  79.          @ 22,0 SAY "Enter transaction number " GET m->tran_no PICTURE "999"
  80.          READ
  81.          key_press = keypress()
  82.          IF key_press = 12    && Esc
  83.             LOOP
  84.          ENDIF
  85.          LOCATE FOR Tran_No = m->tran_no
  86.          IF .NOT. EOF()
  87.             c_new_rec = .F.
  88.             DO gethdr
  89.          ENDIF
  90.       CASE usr_inp = "/" .OR. usr_inp = "X"
  91.          EXIT
  92.       ENDCASE
  93.    ENDDO
  94. RETURN
  95.  
  96. PROCEDURE gethdr
  97.  * Procedure to get or modify the transaction header
  98.  * The transaction number is assign for new transactions only
  99.  * by incrementing the last transaction.  This technique would
  100.  * not be suitable to a multi-user application.
  101.  * This procedure will also set up and call the engine if the
  102.  * transaction is accepted.
  103.    IF c_new_rec
  104.       GO BOTTOM
  105.       tran_no = tranhdr->Tran_No + 1
  106.       tran_desc = SPACE(LEN(tranhdr->Tran_Desc))
  107.       tran_amt = 0 
  108.    ELSE
  109.       tran_no = tranhdr->Tran_No
  110.       tran_desc = tranhdr->Tran_Desc
  111.       tran_amt = tranhdr->Tran_Amt
  112.    ENDIF
  113.    SET COLOR TO &vid_nrml
  114.    @  5,0 CLEAR
  115.    @  5,5 TO 11,74 DOUBLE      
  116.    @  6,10 SAY  "Transaction Number"
  117.    @  8,17 SAY  "Description"
  118.    @ 10,22 SAY  "Amount"
  119.    SET COLOR TO &vid_bright
  120.    @ 6,30  SAY  m->tran_no PICTURE "###"  
  121.    SET COLOR TO &vid_rvrs
  122.    @ 23,0 SAY "Press Esc to return to menu"
  123.    SET COLOR TO &vid_nrml
  124.    c_amc = 2
  125.    DO WHILE c_amc = 2
  126.       @ 8,30 GET m->tran_desc
  127.       @ 10,30 GET m->tran_amt PICTURE "999999.99 "
  128.       READ
  129.       @ 23,0                  && Clear Esc message
  130.       key_press = keypress()
  131.       IF key_press = 12    && Esc
  132.          RETURN
  133.       ENDIF
  134.       DO qamc WITH IIF(c_new_rec,2,1) && Add record as displayed or 
  135.                                       && Save record with changes
  136.    ENDDO
  137.    IF c_amc = 1
  138.       SELECT tranhdr
  139.       IF c_new_rec
  140.          APPEND BLANK
  141.          REPLACE Tran_No WITH m->tran_no
  142.       ENDIF
  143.       REPLACE Tran_Desc WITH m->tran_desc, ;
  144.               Tran_Amt WITH m->tran_amt
  145.       SET SAFETY OFF
  146.       SELECT Dstrwork
  147.       IF c_new_rec
  148.          ZAP
  149.          rmng_2_bal = tranhdr->Tran_Amt
  150.       ELSE
  151.          USE
  152.          SELECT trandstr
  153.          SET DELETED ON
  154.          COPY TO Dstrwork FOR Tran_No = tranhdr->Tran_No
  155.          SELECT 3
  156.          USE Dstrwork
  157.          rmng_2_bal = tranhdr->Tran_Amt - tranhdr->Dstr_Total
  158.       ENDIF
  159.       SET SAFETY ON
  160.     * Scope memory variables for distribution
  161.       STORE SPACE(LEN(trandstr->Dstr_To)) TO dstr_to
  162.       STORE 0 TO dstr_amt
  163.     * Assign procedures for engine       
  164.       zd_screen  = "DO dstrscn"
  165.       zd_display = "DO dstrdsp"
  166.       zd_init    = "DO dstrinit"
  167.       zd_get     = "DO dstrget"
  168.       zd_append  = "DO dstrapp"
  169.       zd_modify  = "DO dstrmod"
  170.       zd_insert  = "DO dstrins"
  171.       zd_delete  = "DO dstrdel"
  172.       zd_file    = "DO dstrfile"
  173.       zd_alias   = "dstrwork"
  174.     * Call the engine
  175.       DO zerodstr WITH (rmng_2_bal)
  176.    ENDIF
  177. RETURN         
  178.  
  179. PROCEDURE dstrscn          
  180.  * Paint screen for distribution
  181.  * this procedure is assigned to variable zd_screen
  182.    SELECT Dstrwork 
  183.    @ 12,0  CLEAR 
  184.    @ 12,5 TO 20,74 DOUBLE      
  185.    @ 15,6 TO 15,73 
  186.    @ 15,5 SAY CHR(199)
  187.    @ 15,74 SAY CHR(182)
  188.    @ 13,11 SAY "Distribution Item"
  189.    @ 13,37 SAY "of"
  190.    @ 14,8  SAY "Remaining to Balance"
  191.    @ 16,15 SAY "Distribute to"
  192.    @ 18,22 SAY "Amount"
  193.    SET COLOR TO &vid_bright
  194.    @ 13,31 SAY cur_item PICTURE "9999"
  195.    @ 13,40 SAY last_item PICTURE "9999"
  196.    @ 14,31 SAY rmng_2_bal PICTURE "999,999.99"
  197.    SET COLOR TO &vid_nrml
  198. RETURN
  199.  
  200. PROCEDURE dstrdsp          
  201.  * Display current distibution item
  202.  * this procedure is assigned to variable zd_dsp
  203.    SET COLOR TO &vid_bright
  204.    @ 13,31 SAY cur_item PICTURE "9999"
  205.    @ 13,40 SAY last_item PICTURE "9999"
  206.    @ 14,31 SAY rmng_2_bal PICTURE "999,999.99"
  207.    @ 16,31 SAY Dstrwork->Dstr_To
  208.    @ 18,31 SAY Dstrwork->Dstr_Amt PICTURE "999,999.99"
  209.    SET COLOR TO &vid_nrml
  210. RETURN
  211.  
  212. PROCEDURE dstrinit         
  213.  * Initialize memory variables to get an item
  214.  * this procedure is assigned to variable zd_init
  215.    dstr_to = Dstrwork->Dstr_To
  216.    dstr_amt = IIF(c_new_rec,rmng_2_bal,Dstrwork->Dstr_Amt)
  217. RETURN
  218.  
  219. PROCEDURE dstrget
  220.  * Get and read
  221.  * this procedure is assigned to variable zd_get
  222.    @ 16,31 GET m->dstr_to PICTURE REPLICATE("!",LEN(m->dstr_to))
  223.    @ 18,31 GET m->dstr_amt PICTURE "999999.99 "
  224.    READ
  225. RETURN
  226.  
  227. PROCEDURE dstrapp
  228.  * Append item to Dstrwork
  229.  * this procedure is assigned to variable zd_append
  230.    SELECT Dstrwork
  231.    APPEND BLANK
  232.    rmng_2_bal = m->rmng_2_bal - m->dstr_amt
  233.    finished = (rmng_2_bal = 0.)
  234.    DO dstrrepl
  235. RETURN
  236.  
  237. PROCEDURE dstrmod
  238.  * Modify item in Dstrwork
  239.  * this procedure is assigned to variable zd_modify
  240.  * Update rmng_2_bal with difference between old and new values, 
  241.  * and do it before the replace !!
  242.    rmng_2_bal = m->rmng_2_bal - m->dstr_amt + Dstrwork->dstr_amt
  243.    DO dstrrepl
  244. RETURN
  245.  
  246. PROCEDURE dstrins         
  247.  * Insert item in front of current item
  248.  * this procedure is assigned to variable zd_insert
  249.    SELECT Dstrwork
  250.    INSERT BLANK BEFORE
  251.    rmng_2_bal = m->rmng_2_bal - m->dstr_amt
  252.    DO dstrrepl
  253. RETURN
  254.  
  255. PROCEDURE dstrrepl
  256.  * Replace database fields with value of corresponding memory variables
  257.  * This procedure IS NOT assigned to a zd_ variable, but it is 
  258.  * called by procedures dstrapp, dstrmod, and dstrins, and keeps the
  259.  * write to database fields in a single procedure
  260.    REPLACE Dstr_To WITH m->dstr_to, Dstr_Amt WITH m->dstr_amt
  261. RETURN
  262.    
  263. PROCEDURE dstrdel
  264.  * Delete item from Dstrwork
  265.  * this procedure is assigned to variable zd_delete
  266.  * DELETE and PACK statements are in calling procedure
  267.  * only need to adjust rmng_2_bal
  268.    SELECT Dstrwork 
  269.    rmng_2_bal = rmng_2_bal + Dstrwork->dstr_amt
  270. RETURN
  271.  
  272. PROCEDURE dstrfile
  273.  * Distribution has been accepted - write it to permanent files.
  274.  * this procedure is assigned to variable zd_file
  275.  * If we are modifying a previous transaction, we need to delete the
  276.  * the old distribution if the field tranhdr->Dstr_Count is non-zero.
  277.  * After the new distribution is saved, ZAP the workfile.
  278.    SELECT Dstrwork
  279.    PACK
  280.    REPLACE tran_no WITH tranhdr->Tran_No FOR .T.
  281.    USE
  282.    SET DELETED ON
  283.    SELECT trandstr
  284.    IF tranhdr->dstr_count <> 0
  285.       LOCATE FOR Tran_No = tranhdr->Tran_No      && not using an index in this sample
  286.       DELETE WHILE trandstr->Tran_No = tranhdr->Tran_No
  287.    ENDIF
  288.    APPEND FROM Dstrwork
  289.    SELECT tranhdr
  290.    REPLACE dstr_count WITH last_item, dstr_total WITH tran_amt - rmng_2_bal
  291.    SELECT 3
  292.    SET SAFETY OFF
  293.    USE Dstrwork
  294.    ZAP
  295.    SET SAFETY ON
  296. RETURN
  297.  
  298. PROCEDURE zerodstr        
  299. * This is the top level procedure of the Zero-Balanced Distribution Engine
  300. * Parameter passed - rmng_2_balance
  301. * The calling procedure is expected to assign values in the illustrated
  302. *  manner to to the following  variables :
  303. *                                && supply mnemonic or acronym for *
  304. *     zd_screen  = "DO *scn"     && Procedure to paint screen
  305. *     zd_display = "DO *dsp"     && Display current distibution item
  306. *     zd_init    = "DO *init"    && Intialize memory varibles 
  307. *     zd_get     = "DO *get"     && GET and READ
  308. *     zd_append  = "DO *app"     && Append to end of workfile
  309. *     zd_modify  = "DO *mod"     && Modify item
  310. *     zd_insert  = "DO *ins"     && Insert in front current item
  311. *     zd_delete  = "DO *del"     && Delete current item
  312. *     zd_file    = "DO *file"    && File distribution
  313. *     zd_alias   = "alias"       && Alias of workfile
  314. *
  315. *  Macro substitution command is executed as needed to call the above 
  316. *  defined procedures and to reference the workfile. The procedures 
  317. *  in the engine, from the top:
  318. *     zerodstr    - initilizes and controls the prompt 
  319. *                   "File, Review, Append, Cancel".
  320. *     zdreview    - controls the "Enter item number (9999); Prev ..." prompt
  321. *     zdloop      - controls the "Skip, Modify, Insert, Delele" prompt 
  322. *     zdappend    - set up for appending items
  323. *     zdinput     - macro  &zd_get and control "Accept, Modify, Cancel"
  324. *     qfrac       - query  "File, Review, Append, Cancel"
  325. *     qsmid       - query  "Skip, Modify, Insert, Delele"
  326. *  The following procedure are general purpose and used, as well, outside
  327. *  the engine:
  328. *     qamc        - query  "Accept, Modify, Cancel"
  329. *     qyesno      - query  "Yes No" to parameter question
  330. *     pause       - suspend for up to 60 seconds
  331. *     hlpcr       - press Enter to continue
  332. *     keypress    - returns low value of READKEY()
  333. *
  334. PARAMETER rmng_2_bal
  335. PRIVATE dstr_mode,NO_INPUT,APPEND_ITM,MODIFY_ITM,INSERT_ITM
  336. PRIVATE c_amc,c_smid,c_frac,c_new_rec
  337. PRIVATE c_item,last_item
  338. STORE 0 TO c_amc,c_smid,c_frac
  339. STORE .F. TO c_new_rec
  340. NO_INPUT = 0
  341. APPEND_ITM = 1
  342. MODIFY_ITM = 2
  343. INSERT_ITM = 3
  344. IF TYPE("zd_rvwonly") <> "L"
  345.    PRIVATE zd_rvwonly
  346.    zd_rvwonly = .F.
  347. ENDIF
  348. IF TYPE("rvwmsg_row") <> "N"
  349.    PRIVATE rvwmsg_row
  350.    rvwmsg_row = 23
  351. ELSE
  352.    IF rvwmsg_row < 0 .OR. rvwmsg_row > 24
  353.       PRIVATE rvwmsg_row
  354.       rvwmsg_row = 23
  355.    ENDIF
  356. ENDIF
  357. IF TYPE("rvwmsg_col") <> "N"
  358.    PRIVATE rvwmsg_col
  359.    rvwmsg_col = 0
  360. ELSE
  361.    IF rvwmsg_col < 0 .OR. rvwmsg_col > 64
  362.       PRIVATE rvwmsg_col
  363.       rvwmsg_col = 0
  364.    ENDIF
  365. ENDIF
  366. SELECT &zd_alias
  367. last_item = RECCOUNT()
  368. cur_item = IIF(last_item=0,0,1)
  369. GO TOP
  370. IF zd_rvwonly
  371.    &zd_screen
  372.    IF cur_item <> 0
  373.       &zd_display
  374.    ENDIF
  375.    DO zdreview
  376.    SELECT &zd_alias
  377.    SET SAFETY OFF
  378.    ZAP
  379.    SET SAFETY ON   
  380.    RETURN
  381. ENDIF
  382. dstr_mode = IIF(last_item=0, APPEND_ITM,NO_INPUT)
  383. c_frac = 0
  384. DO WHILE c_frac = 0
  385.    IF dstr_mode = APPEND_ITM
  386.       DO zdappend
  387.    ELSE
  388.       &zd_screen
  389.       IF cur_item <> 0
  390.          &zd_display
  391.       ENDIF
  392.    ENDIF
  393.    DO qfrac
  394.    DO CASE
  395.    CASE  c_frac = 1                                    && File distribution
  396.       IF last_item = 0
  397.          IF qyesno("File with zero items ? ","N") <> 1
  398.             c_frac = 0
  399.             LOOP
  400.          ENDIF  
  401.       ENDIF  
  402.       &zd_file
  403.    CASE  c_frac = 2                                    && Review items
  404.       DO zdreview
  405.       dstr_mode = NO_INPUT
  406.       c_frac = 0
  407.    CASE  c_frac = 3                                    && Append items
  408.       c_new_rec = .T.
  409.       cur_item = last_item
  410.       dstr_mode = APPEND_ITM
  411.       c_frac = 0
  412.    CASE  c_frac = 4  .OR. c_frac = -1                  && Cancel distribution
  413.       SELECT &zd_alias
  414.       SET SAFETY OFF
  415.       ZAP
  416.       SET SAFETY ON   
  417.       @ 23,0
  418.       ?? "No Action!"
  419.       DO pause WITH 2
  420.       @ 23,0
  421.       ** will exit
  422.    ENDCASE
  423. ENDDO
  424. *
  425. RETURN                    
  426.  
  427. PROCEDURE zdreview        
  428. *
  429. PRIVATE ok, all_left
  430. IF last_item = 0
  431.    @ 22,0 CLEAR
  432.    ?? "There are no items to review."
  433.    DO hlpcr WITH "Press ─┘ to continue "
  434. ENDIF
  435. all_left = .F.
  436. key_press = 0
  437. DO WHILE .T.
  438.    IF last_item = 0       && All items can be deleted
  439.       RETURN
  440.    ENDIF
  441.    key_press = IIF(key_press=15 .OR. key_press=271,0,key_press)
  442.    IF .NOT. all_left  .AND. key_press = 0
  443.       usr_inp = "    "
  444.       @ 22,0 CLEAR
  445. ?? "Enter item number (9999); Previous, Next, or All remaining; End review"
  446. ?  "[Press ─┘ for item (last) displayed. Also:   PgUp PgDn]"                  
  447.       SET COLOR TO &vid_bright 
  448.       @ 22,26 SAY "P"
  449.       @ 22,36 SAY "N"
  450.       @ 22,45 SAY "A"
  451.       @ 22,60 SAY "E"
  452.       SET COLOR TO &vid_nrml
  453.       @ 22,72 GET usr_inp  PICTURE "!!!!" 
  454.       READ 
  455.       key_press = keypress()
  456.    ENDIF
  457.    key_press = IIF(key_press=15,0,key_press)
  458.    usr_inp = TRIM(usr_inp)
  459.    DO CASE
  460.    CASE usr_inp $ "E/" .OR. key_press = 12 .OR. usr_inp = "0000"
  461.       @ 22,0 CLEAR
  462.       RETURN 
  463.    CASE  .NOT. all_left .AND. LEN(usr_inp) = 0 .AND. key_press = 0
  464.       DO zdloop 
  465.    CASE usr_inp = "A" .OR. all_left
  466.       try_item = IIF(all_left,cur_item+1,cur_item) 
  467.       all_left = .T. 
  468.       IF try_item > last_item 
  469.          all_left = .F. 
  470.          cur_item = IIF(last_item > 0, 1, 0)
  471.          GO TOP
  472.          &zd_screen
  473.          IF cur_item <> 0
  474.             &zd_display
  475.          ENDIF
  476.       ELSE 
  477.          SELECT &zd_alias 
  478.          GOTO try_item 
  479.          cur_item = try_item 
  480.          DO zdloop 
  481.       ENDIF 
  482.    CASE usr_inp = "N" .OR. key_press = 5   && DownArrow - next item
  483.       try_item = cur_item + 1 
  484.       IF try_item <= last_item 
  485.          SELECT &zd_alias 
  486.          GOTO try_item 
  487.          cur_item = try_item 
  488.          DO zdloop 
  489.       ENDIF 
  490.    CASE usr_inp = "P" .OR. key_press = 4   && UpArrow - previous item
  491.       try_item = cur_item - 1 
  492.       IF try_item > 0 
  493.          SELECT &zd_alias 
  494.          GOTO try_item 
  495.          cur_item = try_item 
  496.          DO zdloop 
  497.       ENDIF 
  498.    CASE key_press = 6                      && PgUp - first item
  499.       SELECT &zd_alias
  500.       GO TOP
  501.       cur_item = 1
  502.       DO zdloop 
  503.    CASE key_press = 7                      && PgDn - last item
  504.       SELECT &zd_alias
  505.       GO BOTTOM
  506.       cur_item = last_item
  507.       DO zdloop 
  508.    OTHERWISE
  509.       try_item = VAL(usr_inp) 
  510.       IF try_item > 0 .AND. try_item <= last_item 
  511.          SELECT &zd_alias 
  512.          GOTO try_item 
  513.          cur_item = try_item 
  514.          DO zdloop 
  515.       ENDIF
  516.       key_press = 0
  517.    ENDCASE          
  518. ENDDO         
  519. *
  520. RETURN                    
  521.  
  522. PROCEDURE zdloop          
  523. *
  524. key_press = 0
  525. SELECT &zd_alias
  526. c_bright = .F.
  527. &zd_screen
  528. &zd_display
  529. IF zd_rvwonly
  530.    @ 22,0 CLEAR
  531.    SET COLOR TO &vid_bright
  532.    @ rvwmsg_row,rvwmsg_col SAY 'Review Only'
  533.    SET COLOR TO &vid_nrml
  534.    DO hlpcr WITH "Press ─┘ to continue "
  535.    RETURN
  536. ENDIF
  537. c_smid = 0 
  538. DO WHILE c_smid = 0
  539.    DO qsmid             && Skip, Modify, Insert, or Delete ? 
  540.    DO CASE
  541.    CASE  c_smid = 1 .OR. c_smid = -1                        &&    S k i p
  542.       RETURN
  543.    CASE  c_smid = 2                                         &&    M o d i f y
  544.       SET COLOR TO &vid_bright
  545.       @ rvwmsg_row,rvwmsg_col SAY "Modifying Item"
  546.       SET COLOR TO &vid_nrml
  547.       dstr_mode = MODIFY_ITM
  548.       c_new_rec = .F.
  549.       &zd_init
  550.       DO zdinput
  551.       IF c_amc = 1
  552.          &zd_modify
  553.       ELSE 
  554.          &zd_display
  555.          STORE 0 TO c_amc,c_smid
  556.          ** reexecute WHILE c_smid = 0 loop
  557.       ENDIF
  558.    CASE  c_smid = 3                                         &&    I n s e r t
  559.       SET COLOR TO &vid_bright
  560.       @ rvwmsg_row,rvwmsg_col SAY "Inserting Item"
  561.       SET COLOR TO &vid_nrml
  562.       dstr_mode = INSERT_ITM
  563.       c_new_rec = .T.
  564.       &zd_init
  565.       DO zdinput
  566.       IF c_amc = 1
  567.          &zd_insert
  568.          last_item = last_item + 1
  569.       ELSE 
  570.          &zd_display
  571.          STORE 0 TO c_amc,c_smid
  572.          ** reexecute WHILE c_smid = 0 loop
  573.       ENDIF
  574.    CASE  c_smid = 4                                         &&    D e l e t e
  575.       IF qyesno("Really delete this item ?","N") = 1
  576.          &zd_delete
  577.          DELETE
  578.          PACK
  579.          last_item = last_item - 1
  580.          cur_item = IIF(cur_item > last_item, last_item, cur_item)
  581.          cur_item = IIF(all_left .AND. (cur_item > 0) , cur_item - 1, cur_item)
  582.          IF cur_item <> 0 
  583.             GOTO cur_item
  584.          ENDIF
  585.       ENDIF
  586.    ENDCASE
  587. ENDDO
  588. IF .NOT. all_left
  589.    &zd_screen
  590.    IF cur_item <> 0
  591.       &zd_display
  592.    ENDIF
  593. ENDIF  
  594. *
  595. RETURN                    
  596.  
  597. PROCEDURE zdappend        
  598. *
  599. PRIVATE finished
  600. c_new_rec = .T.
  601. finished = .F.
  602. DO WHILE .NOT. finished
  603.    cur_item = cur_item + 1
  604.    &zd_screen
  605.    &zd_init
  606.    DO zdinput
  607.    IF c_amc = 1
  608.       &zd_append
  609.       last_item = last_item + 1
  610.    ELSE 
  611.       cur_item = cur_item - 1
  612.    ENDIF
  613.    finished = finished .OR. (keypress() = 12)    && Esc
  614.    IF finished 
  615.       GO cur_item
  616.       &zd_display
  617.    ENDIF
  618. ENDDO
  619. *
  620. RETURN                    
  621.  
  622. PROCEDURE zdinput
  623.    c_amc = 2
  624.    DO WHILE c_amc = 2
  625.       &zd_get
  626.       @ rvwmsg_row,rvwmsg_col SAY "              "
  627.       key_press = keypress()
  628.       IF key_press = 12    && Esc
  629.          RETURN
  630.       ENDIF
  631.       DO qamc WITH IIF(dstr_mode = MODIFY_ITM,1,2)
  632.    ENDDO
  633. RETURN                    
  634.  
  635. PROCEDURE qfrac           
  636. *
  637. PRIVATE usr_inp
  638. @ 23,0
  639. IF TYPE("no_bal_msg")<> "L"
  640.    PRIVATE no_bal_msg
  641.    STORE .F. TO no_bal_msg
  642. ENDIF
  643. IF no_bal_msg
  644.    usr_inp = "F "
  645. ELSE
  646.    SET COLOR TO &vid_rvrs
  647.    IF rmng_2_bal = 0
  648.       ?? "Distribution is in balance"
  649.       usr_inp = "F "
  650.    ELSE
  651.       ?? "Distribution is not in balance",CHR(7)
  652.       usr_inp = IIF(last_item = 0,"A ","R ")
  653.    ENDIF
  654.    SET COLOR TO &vid_nrml
  655. ENDIF
  656. c_frac = 0
  657. DO WHILE c_frac = 0
  658.    @ 22,0
  659.    @ 22,0 SAY "File, Review, Append, Cancel (F/R/A/C) " ;
  660.       GET usr_inp PICTURE "!!"
  661.    READ
  662.    key_press = keypress()
  663.    DO CASE
  664.    CASE  usr_inp = "/" .OR. key_press = 12    && Esc
  665.       c_frac = -1
  666.    CASE  usr_inp = "F" .OR. usr_inp = "1"
  667.       c_frac = 1
  668.    CASE  usr_inp = "R" .OR. usr_inp = "2"
  669.       c_frac = 2
  670.    CASE  usr_inp = "A" .OR. usr_inp = "3"
  671.       c_frac = 3
  672.    CASE  usr_inp = "C" .OR. usr_inp = "4"
  673.       c_frac = 4
  674.    ENDCASE
  675.    usr_inp = "  "
  676. ENDDO
  677. @ 22,0 CLEAR
  678. *
  679. RETURN                    
  680.  
  681. PROCEDURE qsmid           
  682. *
  683.    PRIVATE usr_inp, col
  684.    usr_inp = 1
  685.    @ 22,0 CLEAR
  686.    IF TYPE("all_left") <> "L"
  687.       PRIVATE all_left
  688.       all_left = .F.
  689.    ENDIF
  690.    col = IIF(all_left,10,25)
  691.    @ 23,col      PROMPT "Skip"   MESSAGE "No change to item displayed."
  692.    @ 23,col+6    PROMPT "Modify" MESSAGE "Change item displayed." 
  693.    @ 23,col+14   PROMPT "Insert" MESSAGE "Insert new item before item displayed."
  694.    @ 23,col+22   PROMPT "Delete" MESSAGE "Delete item displayed."
  695.    IF all_left
  696.      @ 23,col+30 PROMPT 'Cancel "All Remaining" Option' MESSAGE "Also skip item displayed."
  697.    ENDIF
  698.    SET MESSAGE TO 24
  699.    MENU TO usr_inp
  700.    key_press = keypress()
  701.    @ 23,0 CLEAR
  702.    DO CASE
  703.    CASE  usr_inp = 1
  704.       c_smid = 1
  705.    CASE  usr_inp = 2
  706.       c_smid = 2
  707.    CASE  usr_inp = 3
  708.       c_smid = 3
  709.    CASE  usr_inp = 4
  710.       c_smid = 4
  711.    CASE  usr_inp = 0 .OR. usr_inp = 5
  712.       press = "/"
  713.       c_smid = -1
  714.       all_left = .F.
  715.    ENDCASE
  716. *
  717. RETURN                    
  718.  
  719. PROCEDURE qamc            
  720. *
  721. PARAMETER qamc_type
  722. * 1  Modify existing record
  723. * 2  Add new record
  724. * 3  Proceed as displayed
  725. press = " "
  726. PRIVATE usr_inp
  727. usr_inp = 1
  728. @ 23,29 PROMPT "Accept" MESSAGE IIF(qamc_type = 3,"Proceed as specified.", ;
  729.    IIF(qamc_type=2,"Add record as displayed.","Save record with changes."))
  730. @ 23,37 PROMPT "Modify" MESSAGE IIF(qamc_type = 3,"Change specifications.", ;
  731.    "Make changes to record.")
  732. @ 23,45 PROMPT "Cancel" MESSAGE IIF(qamc_type = 3,"Return to menu.", ;
  733.    IIF(qamc_type=2,"Do not add record.","Disregard any changes made."))
  734. SET MESSAGE TO 24
  735. MENU TO usr_inp
  736. key_press = keypress()
  737. @ 23,0 CLEAR
  738. DO CASE
  739. CASE  usr_inp = 1
  740.    c_amc = 1
  741. CASE  usr_inp = 2
  742.    c_amc = 2
  743. CASE  usr_inp = 3
  744.    c_amc = 3
  745. CASE  usr_inp = 0
  746.    press = "/"
  747.    c_amc = -1
  748. ENDCASE
  749. *
  750. RETURN                    
  751.  
  752. PROCEDURE qyesno          
  753. *
  754. PARAMETERS prompt,initial
  755. PRIVATE col,test,usr_inp
  756. initial = UPPER(LEFT(initial+"  ",2))
  757. usr_inp = IIF(initial = "Y",2,1)
  758. @ 23,0 CLEAR
  759. test = LEN(TRIM(prompt))
  760. col = (80-LEN(prompt)-9)/2
  761. @ 23,col SAY prompt
  762. @ 23,col+test+7 PROMPT "No"
  763. @ 23,col+test+2 PROMPT "Yes"
  764. MENU TO usr_inp
  765. key_press = keypress()
  766. @ 23,0 CLEAR
  767. * Return Value is 1 if Y
  768. *                 0 if N
  769. *                -1 if Esc
  770. RETURN usr_inp - 1        
  771.  
  772. PROCEDURE pause           
  773. *
  774. * use to pause between 0 & 60 seconds
  775. * if outside range, prompt
  776. PARAMETER kount
  777. PRIVATE start,now
  778. IF kount < 0 .OR. kount > 60
  779.    DO hlpcr WITH 'Press ─┘ to continue '
  780.    RETURN
  781. ENDIF
  782. start = VAL(RIGHT(TIME(),2))
  783. now = start
  784. DO WHILE start+kount > now
  785.    now = VAL(RIGHT(TIME(),2))
  786.    IF now < start
  787.       now = now + 60
  788.    ENDIF
  789. ENDDO
  790. *
  791. RETURN                    
  792.  
  793. PROCEDURE hlpcr           
  794. *
  795. PARAMETER message
  796. IF TYPE("bell_off") <> "L"
  797.    PRIVATE bell_off
  798.    bell_off = .F.
  799. ENDIF
  800. @ 23,0 CLEAR
  801. ?? IIF(bell_off,"",CHR(7))
  802. press = " "
  803. @ 23,0 SAY message GET press
  804. READ
  805. key_press = keypress()
  806. press = IIF(key_press=12,"/",press)    && compatible with older versions
  807. @ 23,0 CLEAR
  808. *
  809. RETURN                    
  810.  
  811. PROCEDURE keypress        
  812. *
  813. key_press = READKEY()
  814. key_press = IIF(key_press>36,key_press-256,key_press)
  815. *
  816. RETURN key_press          
  817.  
  818.